-==CD-Check remove Tutor 02==-

Autor: |VerTex|
Datum: 06.10.1999
Email: VerTex.TGC@gmx.net

-=Inhalt=-
1. Einleitung
2. Programm
3. Tools
4. Tutor
5. Sonstiges

-=1=-
Hi Leute! Jetzt mein 2. Tutor um CD-Checks zu removen. Auch noch an meinem 18. Geburtstag, weil
ich ja sonst nichts besseres zu tun habe. Ich setze die Kenntnisse aus dem 1. Tutor voraus. Wenn
ihr das Tutor noch nicht habt, dann holt es euch (www.move.to/TGC). 

-=2=-
Das Programm das wir heute "ficken" ist das Setup Programm von "Shadow Man". Es ist ein wenig 
schwerer als Turok, aber ihr wollt ja was dazu lernen. ACHTUNG: Ich habe die englische Version 
von Shadow Man benutzt. Bei der deutschen Version knnen die Angaben etwas abweichen.

-=3=- 
1. Das Game Installiert oder nur kopiert (ist besser). Datei: D3DConfigUtility 
2. W32Dasm      -> http://203.148.211.201/files/s-w32dsm.zip              
3. Einen Hex Editor
4. Eine Programmiersprache, um den crack zu schreiben.

-=4=-
Los geht's. Wie blich, das Programm das wir cracken wollen ohne CD starten, den Inhalt der 
Message Box aufschreiben und dann W32Dasm laden, disassemblen und dann in den "Strg Refs" nach
dem String suchen. Ha, diesmal nicht (steht nicht in den "Strg Refs"), funktioniert so wieso 
nicht (habe schon probiert, den Jump zu faken, vergesst es!). Aber wir wissen ja aufgrund des
Inhaltes der Message Box "Please Insert your ShadowMan CD", dass er auf die CD zugreifen will.
Da muss er aber erst feststellen ob eine CD im Laufwerk ist und das macht er mit "GetDriveTypeA".
Also gehen wir auf die "Imports" und suchen da nach "Kernel32.GetDriveTypeA". Gefunden, dann 
doppelclick drauf und wir sind im Code wo die Procedure aufgerufen wird. Jetzt suchen wir die
Stelle, von wo der Befehl (prfen ob CD vorhanden) ausgefhrt wird. Dazu gehen wir im Code 
solange nach oben bis wir das gefunden haben.

>* Referenced by a CALL at Address:
>|:004030E8                            <-- Von der Stelle im Code wird der Befehl aufgerufen.
>|
>:00402970 81EC4C010000            sub esp, 0000014C
>:00402976 A1ACD04000              mov eax, dword ptr [0040D0AC]
>:0040297B 53                      push ebx
>:0040297C 55                      push ebp
>
>* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h     <-- GetDriveTypeA (prft ob CD vorhanden)
>                                  |
>:0040297D 8B2D30A04000            mov ebp, dword ptr [0040A030]
>:00402983 56                      push esi
>:00402984 57                      push edi
>:00402985 89442458                mov dword ptr [esp+58], eax
>:00402989 B940000000              mov ecx, 00000040
>:0040298E 33C0                    xor eax, eax
>:00402990 8D7C245C                lea edi, dword ptr [esp+5C]
>:00402994 F3                      repz
>:00402995 AB                      stosd

Nun gehen wir, mit "Goto", zu der Stelle 004030E8. Wir sehen folgendes. 

>* Reference To: COMCTL32.InitCommonControls, Ord:0011h
>                                  |
>:004030D8 FF1510A04000            Call dword ptr [0040A010]
>:004030DE E8ADFEFFFF              call 00402F90
>:004030E3 E838FCFFFF              call 00402D20
>:004030E8 E883F8FFFF              call 00402970  <-- Bingo! Hier wird der Befehl "gecallt"
>:004030ED E80EFDFFFF              call 00402E00
>:004030F2 E899F9FFFF              call 00402A90
>:004030F7 E8A4E2FFFF              call 004013A0
>:004030FC B90D000000              mov ecx, 0000000D
>:00403101 33C0                    xor eax, eax
>:00403103 BFC0F04000              mov edi, 0040F0C0

So, hier wird der Befehl aufgerufen und dann bekommt er einen Rckgabewert und luft weiter im 
Code nach unten. Wir schreiben jetzt anstatt des Calls den positiven Rckgabewert in den Code.
Damit wird erreicht, dass der call (prfen von der CD) nicht aufgerufen wird, sondern von Anfang
an ein positiver Wert erkannt wird, und somit kein Fehler auftritt. Dazu laden wir den Code in
den Compiler (Strg + L), gehen dann mit "Goto Adress" zur Adresse 004030E8 und dann auf "Patch 
Code". Hier geben wir folgendes ein: "mov eax,1" (positiver Wert) und drcken Enter. Auf "Apply
Patch", "Ja" clicken, auf "Close" und nochmals auf "Ja" clicken, und dann "Run". Keine Message
Box mehr vonwegen CD usw., aber jetzt eine andere Fehler Meldung (falls da Spiel nur kopiert 
wurde und nicht installiert.) Dann steht da "Click Ok to Install Shadow Man". Jetzt clicken wir 
auf "Step Into F7" im Fenster mit dem "Run" Button und dann anschlieend auf "Terminate" und auf
"Ja". Jetzt sind wir zurck im Programm Code an der Stelle wo die letzte Aktion im Programm, das
wir gestartet hatten, ausgefhrt wurde (in dem Fall die Message Box mit dem Titel "Click Ok to 
Install Shadow Man").

>* Reference To: ADVAPI32.RegOpenKeyExA, Ord:0172h
>                                  |
>:00402E1E FF1500A04000            Call dword ptr [0040A000]
>:00402E24 85C0                    test eax, eax
>:00402E26 0F84AD000000            je 00402ED9        <-- Der letzte Jump for der Fehler Meldung
>:00402E2C A104EF4000              mov eax, dword ptr [0040EF04]
>:00402E31 6A01                    push 00000001
>
>* Possible StringData Ref from Data Obj ->"ShadowMan"
>                                  |
>:00402E33 6848D04000              push 0040D048
>:00402E38 8B4828                  mov ecx, dword ptr [eax+28]
>:00402E3B 51                      push ecx
>:00402E3C 6A00                    push 00000000
>
>* Reference To: USER32.MessageBoxA, Ord:01BEh
>                                  |
>:00402E3E FF1510A14000            Call dword ptr [0040A110]
>:00402E44 83F801                  cmp eax, 00000001
>:00402E47 7407                    je 00402E50           <-- Hier drften wir uns jetzt befinden!
>:00402E49 6A00                    push 00000000
>:00402E4B E83E050000              call 0040338E

Und wer sich das hier mal so anschaut, msste nach dem Tutor 1 genau wissen was er jetzt zu tun 
hat. Genau den Letzten Jump vor der Message Box Faken! Und das wre in diesem Falle der Jump an
der Stelle 00402E26. den mssen wir von "je" zu "jne" umndern. Ok, den Code wieder laden Strg+L 
und beide Stellen (004030E8, der Call zum Befehl GetDriveTypeA und bei 00402E26, der Letze Jump 
vor der Message Box) umschreiben. Wenn das geschafft ist nur noch auf "Run" clicken. BOOM!!! Ihr
habt es mal wieder geschafft. Keine Fehlermeldung :)

Ok, was jetzt? Ja genau, die Offsets der Stellen aufschreiben und den Original Code (aus dem 
Programm Code) mit dem umgeschriebenen Code (aus dem "Patch Code" Feld) vergleichen. Bei mir
kam das dann raus.

1. Um den call zu "GetDriveTypeA" umzuschreiben...
   Offset: 30E8 hex
Uncracked: E883 F8FF FF hex
  Cracked: B801 0000 00 hex

2. Um den Jump zur "MessageBoxA" zu faken...  
   Offset: 2E26 hex
Uncracked: 0F84 hex
  Cracked: 0F85 hex

Mit den Daten, knnt ihr dann hoffentlich euren eigenen crack schreiben, falls nicht dann be-
nutzt einfach einen Hex Editor!
--------------Ende des Tutors--------------

-=5=-
Und das war es schon wieder, das 2. Tutor ist nun zu Ende. Probleme mit dem Tutor? Beschwerden? 
Probs? Mailt mir. Ich hoffe ihr versteht das Tutor. Bis vielleicht zum nchsten Tutor und checkt 
unsere Homepage mal raus. http://www.move.to/tgc



